package com.zhang.designmode.wangzheng_design_mode.T41;

import java.io.Serializable;

/**
 * @Author: zhangxuzhuang
 * @DateTime: 2021/12/23 23:38
 * @Description: 饿汉式单例
 */
// 1.为什么要加final?   防止子类继承父类，子类中的一些不适当操作破坏单例。
// 2.如果实现了序列化接口，还要做什么来防止反序列化破坏单例?    private Object readResolve() {return instance;}
//这个方法在反序列化创建对象时会直接return当前的对象，而不会将字节码生成对象当成结果返回而破坏单例。
public final class SingleOfHungry implements Serializable {

    // 3.为什么要设置私有？是否能反射创建新的实例？  还是可以的,设置为私有的是不能new 对象
    private SingleOfHungry() {
    }

    //4.这样初始化能否保证单例对象创建时的线程安全？能，静态成员变量的初始化是在类加载阶段完成的，jvm会保证类加载阶段代码的线程安全性
    private final static SingleOfHungry INSTANCE = new SingleOfHungry();

    // 5.为什么提供静态方法而不是直接将instanse设置为public？ 使用方法会方便更好的改进，而使用变量暴露则无法进行改进
    public static SingleOfHungry getInstance() {
        return INSTANCE;
    }

    private Object readResolve() {
        return INSTANCE;
    }

}
